Cloud Firestoreのデータモデル
https://gyazo.com/97c58f65a3e0b001e33e9068e7f8e0e3 https://firebase.google.com/docs/firestore/data-model?hl=ja
データを構造化する方法
ドキュメント
ユーザ「alovelace」を表すドキュメント
https://gyazo.com/c6ca2b2b90fad8d4387454105c2aa9e0
一般的にドキュメントは、軽量のJSONレコードとして扱える Cloud Firestoreは、小型のドキュメントの大きなコレクションを格納するために最適化されている
「サブコレクション」と、ネストされたオブジェクトを格納できる
コレクション
usersコレクションに、ユーザを表すドキュメントを格納する例
https://gyazo.com/4f4a7ec6c3e0754154974f425e36ddbc
単なるドキュメントのコンテナ
コレクション内のドキュメントの名前は一意であるべき
ユーザーID
独自アルゴリズムで与えたキー
Firestoreでadd()した際に自動採番されたランダムなID
コレクションの作成、削除は全自動
必要なら生成される
空になったら勝手に消える
リファレンス
すべてのドキュメントは、DB内の場所によって一意に識別される
code:js
const alovelaceDocumentRef = db.collection('users').doc('alovelace')
参照を作成しているだけ
リファレンスを作成してもネットワーク操作は実行されません。
alovelaceDocumentRefには、データ実体は入っていない
ref作成操作においては、データの実体の有無は不可知
もちろん、コレクションへのrefも作れる
この書き方はmongoそのものだな
code:js
const usersCollectionRef = db.collection('users')
/を使ったref作成
ドキュメントまたはコレクションへのパスを文字列として指定
パス コンポーネントをスラッシュ(/)で区切ってリファレンスを作成する
code:js
const alovelaceDocumentRef = db.doc('users/alovelace')
これは果たして便利なのか?
階層構造で表現されるデータを保存していく
メッセージとチャットルームの例
rooms: チャットルームを格納するコレクション
いわゆる、ルートレベルのコレクション?
https://gyazo.com/a52e8174fa9da57c63441517243d34ae
チャットルーム内でやりとりされている大量のメッセージをどこに保存するか?
各roomドキュメントの直下に直接的に置くのはいやだ
サブコレクションは特定のドキュメントに関連付けられたコレクションです。
データは最大100レベルまでネストできる
messages: コレクションroomsに関連付けられたサブコレクション
https://gyazo.com/ddf90f1b930007c35b97defb759181d1
メッセージへの参照を作成する
サブコレクション内部のドキュメントまで指定するので少々深くなる
code:js
const messageRef = db.collection('rooms').doc('roomA')
.collection('messages').doc('message1')
// /を使ってこうも書ける?
// 説明はされていなかったが、連想ゲーム的に解くとたぶんこうなる
const messageRef = db.doc('rooms/roomA/messages/message1')
roomA内の全てのmessageにアクセスするには?
階層構造で保存しているので簡単。findAllとか要らない。
code:js
const messages = db.collection('rooms').doc('roomA').collection('messages')
2018/2/20